<?php
/**
 * Table_Posts
 *
 * @package Movoin Blog
 * @subpackage Table
 *
 */

//{{include
FLEA::loadClass ('FLEA_Db_TableDataGateway');
//}}

class Table_Posts extends FLEA_Db_TableDataGateway {

    //数据表名称
    var $tableName = 'posts';

    //数据表主键字段名
    var $primaryKey = 'post_id';

    //定义多对多关联
    var $manyToMany = array(
        'tableClass' => 'table_tags',
        'mappingName' => 'tags',
        'joinTable' => 'posts_has_tags'
    );

    //定义一对多关联
    var $hasMany = array(
		array(
			'tableClass' => 'table_comments',
			'mappingName' => 'comments'
		),
		array(
			'tableClass' => 'table_attachment',
			'mappingName' => 'attach'
		)
    );

    //定义从属关联
    var $belongsTo = array(
        'tableClass' => 'table_categories',
        'mappingName' => 'category',
		'fields' => 'name'
    );

    /**
     * _beforeCreate() 事件在创建记录时引发
     *
     * 我们在这个事件中调用 _processTags() 完成对 tags 的处理工作。
     *
     * @param array $row
     *
     * @return boolean
     */
    function _beforeCreate(& $row)
    {
        return $this->_processTags($row);
    }

    /**
     * _beforeUpdate() 事件在更新记录时引发
     *
     * @param array $row
     *
     * @return boolean
     */
    function _beforeUpdate(& $row)
    {
        return $this->_processTags($row);
    }

    /**
     * 完成对日志条目所关联的 tags 的处理
     *
     * @param array $row
     *
     * @return boolean
     */
    function _processTags(& $row) {
        // 读出数据库现有的所有 tags
        $tableTags =& FLEA::getSingleton('Table_Tags');
        /* @var $tableTags Table_Tags */
        $rowset = $tableTags->findAll(null);

        /**
         * 将记录集转换为名值对
         */
        FLEA::loadHelper('array');
        $existsTags = array_to_hashmap($rowset, 'label');

        // 处理用户输入的 tags
        $labels = explode(' ', $row['tags']);
        array_remove_empty($labels);

        // 载入汉字转拼音助手
        FLEA::loadFile('Helper_pinyin');
        $tags = array();
        foreach ($labels as $label) {
            $label = strtolower($label);
            if (isset($existsTags[$label])) {
                // 将日志登记到现有 tag
                $tags[] = $existsTags[$label];
            } else {
                // 创建新 tag，并登记日志
                $pinyin = is_null(Pinyin($label))?trim(Pinyin($label)):$label;
                $tags[] = array('label' => $label, 'slug' => $pinyin);
            }
        }

        $row['tags'] = $tags;
        return true;
    }

}
